knitr::opts_chunk$set(fig.width=7, fig.height=5) 

1. Medal Counts over Time

1a) Merge all data into one dataset named “olympic”.

#load relevant packages 
library(ggplot2)
library(tidyverse)
#read in all three data files
athletes <- read_csv("athletes_and_events.csv")

|=========                                                                                                                              |   6%    2 MB
|=========                                                                                                                              |   7%    2 MB
|=========                                                                                                                              |   7%    2 MB
|==========                                                                                                                             |   7%    2 MB
|==========                                                                                                                             |   7%    2 MB
|==========                                                                                                                             |   8%    2 MB
|===========                                                                                                                            |   8%    2 MB
|===========                                                                                                                            |   8%    2 MB
|===========                                                                                                                            |   8%    3 MB
|============                                                                                                                           |   9%    3 MB
|============                                                                                                                           |   9%    3 MB
|============                                                                                                                           |   9%    3 MB
|=============                                                                                                                          |   9%    3 MB
|=============                                                                                                                          |   9%    3 MB
|=============                                                                                                                          |  10%    3 MB
|==============                                                                                                                         |  10%    3 MB
|==============                                                                                                                         |  10%    3 MB
|==============                                                                                                                         |  10%    3 MB
|===============                                                                                                                        |  11%    3 MB
|===============                                                                                                                        |  11%    3 MB
|===============                                                                                                                        |  11%    4 MB
|================                                                                                                                       |  11%    4 MB
|================                                                                                                                       |  12%    4 MB
|================                                                                                                                       |  12%    4 MB
|=================                                                                                                                      |  12%    4 MB
|=================                                                                                                                      |  12%    4 MB
|=================                                                                                                                      |  13%    4 MB
|==================                                                                                                                     |  13%    4 MB
|==================                                                                                                                     |  13%    4 MB
|==================                                                                                                                     |  13%    4 MB
|===================                                                                                                                    |  14%    4 MB
|===================                                                                                                                    |  14%    4 MB
|===================                                                                                                                    |  14%    5 MB
|====================                                                                                                                   |  14%    5 MB
|====================                                                                                                                   |  15%    5 MB
|====================                                                                                                                   |  15%    5 MB
|=====================                                                                                                                  |  15%    5 MB
|=====================                                                                                                                  |  15%    5 MB
|=====================                                                                                                                  |  16%    5 MB
|======================                                                                                                                 |  16%    5 MB
|======================                                                                                                                 |  16%    5 MB
|======================                                                                                                                 |  16%    5 MB
|=======================                                                                                                                |  17%    5 MB
|=======================                                                                                                                |  17%    5 MB
|=======================                                                                                                                |  17%    6 MB
|========================                                                                                                               |  17%    6 MB
|========================                                                                                                               |  18%    6 MB
|========================                                                                                                               |  18%    6 MB
|=========================                                                                                                              |  18%    6 MB
|=========================                                                                                                              |  18%    6 MB
|==========================                                                                                                             |  19%    6 MB
|==========================                                                                                                             |  19%    6 MB
|==========================                                                                                                             |  19%    6 MB
|===========================                                                                                                            |  19%    6 MB
|===========================                                                                                                            |  20%    6 MB
|===========================                                                                                                            |  20%    7 MB
|============================                                                                                                           |  20%    7 MB
|============================                                                                                                           |  20%    7 MB
|============================                                                                                                           |  21%    7 MB
|=============================                                                                                                          |  21%    7 MB
|=============================                                                                                                          |  21%    7 MB
|=============================                                                                                                          |  21%    7 MB
|==============================                                                                                                         |  22%    7 MB
|==============================                                                                                                         |  22%    7 MB
|==============================                                                                                                         |  22%    7 MB
|===============================                                                                                                        |  22%    7 MB
|===============================                                                                                                        |  23%    7 MB
|===============================                                                                                                        |  23%    8 MB
|================================                                                                                                       |  23%    8 MB
|================================                                                                                                       |  23%    8 MB
|================================                                                                                                       |  24%    8 MB
|=================================                                                                                                      |  24%    8 MB
|=================================                                                                                                      |  24%    8 MB
|=================================                                                                                                      |  24%    8 MB
|==================================                                                                                                     |  25%    8 MB
|==================================                                                                                                     |  25%    8 MB
|==================================                                                                                                     |  25%    8 MB
|===================================                                                                                                    |  25%    8 MB
|===================================                                                                                                    |  25%    8 MB
|===================================                                                                                                    |  26%    9 MB
|====================================                                                                                                   |  26%    9 MB
|====================================                                                                                                   |  26%    9 MB
|====================================                                                                                                   |  26%    9 MB
|=====================================                                                                                                  |  27%    9 MB
|=====================================                                                                                                  |  27%    9 MB
|=====================================                                                                                                  |  27%    9 MB
|======================================                                                                                                 |  27%    9 MB
|======================================                                                                                                 |  28%    9 MB
|======================================                                                                                                 |  28%    9 MB
|=======================================                                                                                                |  28%    9 MB
|=======================================                                                                                                |  28%    9 MB
|=======================================                                                                                                |  29%   10 MB
|========================================                                                                                               |  29%   10 MB
|========================================                                                                                               |  29%   10 MB
|========================================                                                                                               |  29%   10 MB
|=========================================                                                                                              |  30%   10 MB
|=========================================                                                                                              |  30%   10 MB
|=========================================                                                                                              |  30%   10 MB
|==========================================                                                                                             |  30%   10 MB
|==========================================                                                                                             |  31%   10 MB
|==========================================                                                                                             |  31%   10 MB
|===========================================                                                                                            |  31%   10 MB
|===========================================                                                                                            |  31%   10 MB
|===========================================                                                                                            |  32%   11 MB
|============================================                                                                                           |  32%   11 MB
|============================================                                                                                           |  32%   11 MB
|============================================                                                                                           |  32%   11 MB
|=============================================                                                                                          |  33%   11 MB
|=============================================                                                                                          |  33%   11 MB
|=============================================                                                                                          |  33%   11 MB
|==============================================                                                                                         |  33%   11 MB
|==============================================                                                                                         |  34%   11 MB
|==============================================                                                                                         |  34%   11 MB
|===============================================                                                                                        |  34%   11 MB
|===============================================                                                                                        |  34%   12 MB
|===============================================                                                                                        |  35%   12 MB
|================================================                                                                                       |  35%   12 MB
|================================================                                                                                       |  35%   12 MB
|================================================                                                                                       |  35%   12 MB
|=================================================                                                                                      |  36%   12 MB
|=================================================                                                                                      |  36%   12 MB
|=================================================                                                                                      |  36%   12 MB
|==================================================                                                                                     |  36%   12 MB
|==================================================                                                                                     |  37%   12 MB
|==================================================                                                                                     |  37%   12 MB
|===================================================                                                                                    |  37%   12 MB
|===================================================                                                                                    |  37%   13 MB
|===================================================                                                                                    |  38%   13 MB
|====================================================                                                                                   |  38%   13 MB
|====================================================                                                                                   |  38%   13 MB
|====================================================                                                                                   |  38%   13 MB
|=====================================================                                                                                  |  38%   13 MB
|=====================================================                                                                                  |  39%   13 MB
|=====================================================                                                                                  |  39%   13 MB
|======================================================                                                                                 |  39%   13 MB
|======================================================                                                                                 |  39%   13 MB
|======================================================                                                                                 |  40%   13 MB
|=======================================================                                                                                |  40%   13 MB
|=======================================================                                                                                |  40%   14 MB
|=======================================================                                                                                |  40%   14 MB
|========================================================                                                                               |  41%   14 MB
|========================================================                                                                               |  41%   14 MB
|========================================================                                                                               |  41%   14 MB
|=========================================================                                                                              |  41%   14 MB
|=========================================================                                                                              |  42%   14 MB
|=========================================================                                                                              |  42%   14 MB
|==========================================================                                                                             |  42%   14 MB
|==========================================================                                                                             |  42%   14 MB
|==========================================================                                                                             |  43%   14 MB
|===========================================================                                                                            |  43%   14 MB
|===========================================================                                                                            |  43%   15 MB
|===========================================================                                                                            |  43%   15 MB
|============================================================                                                                           |  44%   15 MB
|============================================================                                                                           |  44%   15 MB
|============================================================                                                                           |  44%   15 MB
|=============================================================                                                                          |  44%   15 MB
|=============================================================                                                                          |  45%   15 MB
|=============================================================                                                                          |  45%   15 MB
|==============================================================                                                                         |  45%   15 MB
|==============================================================                                                                         |  45%   15 MB
|==============================================================                                                                         |  46%   15 MB
|===============================================================                                                                        |  46%   15 MB
|===============================================================                                                                        |  46%   16 MB
|===============================================================                                                                        |  46%   16 MB
|================================================================                                                                       |  47%   16 MB
|================================================================                                                                       |  47%   16 MB
|================================================================                                                                       |  47%   16 MB
|=================================================================                                                                      |  47%   16 MB
|=================================================================                                                                      |  48%   16 MB
|=================================================================                                                                      |  48%   16 MB
|==================================================================                                                                     |  48%   16 MB
|==================================================================                                                                     |  48%   16 MB
|==================================================================                                                                     |  49%   16 MB
|===================================================================                                                                    |  49%   17 MB
|===================================================================                                                                    |  49%   17 MB
|===================================================================                                                                    |  49%   17 MB
|====================================================================                                                                   |  50%   17 MB
|====================================================================                                                                   |  50%   17 MB
|====================================================================                                                                   |  50%   17 MB
|=====================================================================                                                                  |  50%   17 MB
|=====================================================================                                                                  |  51%   17 MB
|=====================================================================                                                                  |  51%   17 MB
|======================================================================                                                                 |  51%   17 MB
|======================================================================                                                                 |  51%   17 MB
|======================================================================                                                                 |  51%   17 MB
|=======================================================================                                                                |  52%   18 MB
|=======================================================================                                                                |  52%   18 MB
|=======================================================================                                                                |  52%   18 MB
|========================================================================                                                               |  52%   18 MB
|========================================================================                                                               |  53%   18 MB
|========================================================================                                                               |  53%   18 MB
|=========================================================================                                                              |  53%   18 MB
|=========================================================================                                                              |  53%   18 MB
|=========================================================================                                                              |  54%   18 MB
|==========================================================================                                                             |  54%   18 MB
|==========================================================================                                                             |  54%   18 MB
|==========================================================================                                                             |  54%   18 MB
|===========================================================================                                                            |  55%   19 MB
|===========================================================================                                                            |  55%   19 MB
|===========================================================================                                                            |  55%   19 MB
|============================================================================                                                           |  55%   19 MB
|============================================================================                                                           |  56%   19 MB
|============================================================================                                                           |  56%   19 MB
|=============================================================================                                                          |  56%   19 MB
|=============================================================================                                                          |  56%   19 MB
|=============================================================================                                                          |  57%   19 MB
|==============================================================================                                                         |  57%   19 MB
|==============================================================================                                                         |  57%   19 MB
|==============================================================================                                                         |  57%   19 MB
|===============================================================================                                                        |  58%   20 MB
|===============================================================================                                                        |  58%   20 MB
|===============================================================================                                                        |  58%   20 MB
|================================================================================                                                       |  58%   20 MB
|================================================================================                                                       |  59%   20 MB
|================================================================================                                                       |  59%   20 MB
|=================================================================================                                                      |  59%   20 MB
|=================================================================================                                                      |  59%   20 MB
|=================================================================================                                                      |  60%   20 MB
|==================================================================================                                                     |  60%   20 MB
|==================================================================================                                                     |  60%   20 MB
|==================================================================================                                                     |  60%   20 MB
|===================================================================================                                                    |  61%   21 MB
|===================================================================================                                                    |  61%   21 MB
|===================================================================================                                                    |  61%   21 MB
|====================================================================================                                                   |  61%   21 MB
|====================================================================================                                                   |  62%   21 MB
|====================================================================================                                                   |  62%   21 MB
|=====================================================================================                                                  |  62%   21 MB
|=====================================================================================                                                  |  62%   21 MB
|=====================================================================================                                                  |  63%   21 MB
|======================================================================================                                                 |  63%   21 MB
|======================================================================================                                                 |  63%   21 MB
|======================================================================================                                                 |  63%   21 MB
|=======================================================================================                                                |  63%   22 MB
|=======================================================================================                                                |  64%   22 MB
|=======================================================================================                                                |  64%   22 MB
|========================================================================================                                               |  64%   22 MB
|========================================================================================                                               |  64%   22 MB
|========================================================================================                                               |  65%   22 MB
|=========================================================================================                                              |  65%   22 MB
|=========================================================================================                                              |  65%   22 MB
|=========================================================================================                                              |  65%   22 MB
|==========================================================================================                                             |  66%   22 MB
|==========================================================================================                                             |  66%   22 MB
|==========================================================================================                                             |  66%   23 MB
|==========================================================================================                                             |  66%   23 MB
|===========================================================================================                                            |  67%   23 MB
|===========================================================================================                                            |  67%   23 MB
|============================================================================================                                           |  67%   23 MB
|============================================================================================                                           |  67%   23 MB
|============================================================================================                                           |  68%   23 MB
|=============================================================================================                                          |  68%   23 MB
|=============================================================================================                                          |  68%   23 MB
|=============================================================================================                                          |  68%   23 MB
|==============================================================================================                                         |  69%   23 MB
|==============================================================================================                                         |  69%   23 MB
|==============================================================================================                                         |  69%   24 MB
|===============================================================================================                                        |  69%   24 MB
|===============================================================================================                                        |  70%   24 MB
|===============================================================================================                                        |  70%   24 MB
|================================================================================================                                       |  70%   24 MB
|================================================================================================                                       |  70%   24 MB
|================================================================================================                                       |  71%   24 MB
|=================================================================================================                                      |  71%   24 MB
|=================================================================================================                                      |  71%   24 MB
|=================================================================================================                                      |  71%   24 MB
|==================================================================================================                                     |  72%   24 MB
|==================================================================================================                                     |  72%   24 MB
|==================================================================================================                                     |  72%   25 MB
|===================================================================================================                                    |  72%   25 MB
|===================================================================================================                                    |  73%   25 MB
|===================================================================================================                                    |  73%   25 MB
|====================================================================================================                                   |  73%   25 MB
|====================================================================================================                                   |  73%   25 MB
|====================================================================================================                                   |  74%   25 MB
|=====================================================================================================                                  |  74%   25 MB
|=====================================================================================================                                  |  74%   25 MB
|=====================================================================================================                                  |  74%   25 MB
|======================================================================================================                                 |  75%   25 MB
|======================================================================================================                                 |  75%   25 MB
|======================================================================================================                                 |  75%   26 MB
|=======================================================================================================                                |  75%   26 MB
|=======================================================================================================                                |  76%   26 MB
|=======================================================================================================                                |  76%   26 MB
|========================================================================================================                               |  76%   26 MB
|========================================================================================================                               |  76%   26 MB
|========================================================================================================                               |  77%   26 MB
|=========================================================================================================                              |  77%   26 MB
|=========================================================================================================                              |  77%   26 MB
|=========================================================================================================                              |  77%   26 MB
|==========================================================================================================                             |  78%   26 MB
|==========================================================================================================                             |  78%   27 MB
|==========================================================================================================                             |  78%   27 MB
|===========================================================================================================                            |  78%   27 MB
|===========================================================================================================                            |  79%   27 MB
|===========================================================================================================                            |  79%   27 MB
|============================================================================================================                           |  79%   27 MB
|============================================================================================================                           |  79%   27 MB
|============================================================================================================                           |  80%   27 MB
|=============================================================================================================                          |  80%   27 MB
|=============================================================================================================                          |  80%   27 MB
|=============================================================================================================                          |  80%   27 MB
|==============================================================================================================                         |  81%   27 MB
|==============================================================================================================                         |  81%   28 MB
|==============================================================================================================                         |  81%   28 MB
|===============================================================================================================                        |  81%   28 MB
|===============================================================================================================                        |  81%   28 MB
|===============================================================================================================                        |  82%   28 MB
|================================================================================================================                       |  82%   28 MB
|================================================================================================================                       |  82%   28 MB
|================================================================================================================                       |  82%   28 MB
|=================================================================================================================                      |  83%   28 MB
|=================================================================================================================                      |  83%   28 MB
|=================================================================================================================                      |  83%   28 MB
|==================================================================================================================                     |  83%   28 MB
|==================================================================================================================                     |  84%   29 MB
|==================================================================================================================                     |  84%   29 MB
|===================================================================================================================                    |  84%   29 MB
|===================================================================================================================                    |  84%   29 MB
|===================================================================================================================                    |  85%   29 MB
|====================================================================================================================                   |  85%   29 MB
|====================================================================================================================                   |  85%   29 MB
|====================================================================================================================                   |  85%   29 MB
|=====================================================================================================================                  |  86%   29 MB
|=====================================================================================================================                  |  86%   29 MB
|=====================================================================================================================                  |  86%   29 MB
|======================================================================================================================                 |  86%   29 MB
|======================================================================================================================                 |  87%   30 MB
|======================================================================================================================                 |  87%   30 MB
|=======================================================================================================================                |  87%   30 MB
|=======================================================================================================================                |  87%   30 MB
|=======================================================================================================================                |  88%   30 MB
|========================================================================================================================               |  88%   30 MB
|========================================================================================================================               |  88%   30 MB
|========================================================================================================================               |  88%   30 MB
|=========================================================================================================================              |  89%   30 MB
|=========================================================================================================================              |  89%   30 MB
|=========================================================================================================================              |  89%   30 MB
|==========================================================================================================================             |  89%   31 MB
|==========================================================================================================================             |  90%   31 MB
|==========================================================================================================================             |  90%   31 MB
|===========================================================================================================================            |  90%   31 MB
|===========================================================================================================================            |  90%   31 MB
|===========================================================================================================================            |  91%   31 MB
|============================================================================================================================           |  91%   31 MB
|============================================================================================================================           |  91%   31 MB
|============================================================================================================================           |  91%   31 MB
|=============================================================================================================================          |  92%   31 MB
|=============================================================================================================================          |  92%   31 MB
|==============================================================================================================================         |  92%   31 MB
|==============================================================================================================================         |  92%   32 MB
|==============================================================================================================================         |  93%   32 MB
|===============================================================================================================================        |  93%   32 MB
|===============================================================================================================================        |  93%   32 MB
|===============================================================================================================================        |  93%   32 MB
|================================================================================================================================       |  94%   32 MB
|================================================================================================================================       |  94%   32 MB
|================================================================================================================================       |  94%   32 MB
|=================================================================================================================================      |  94%   32 MB
|=================================================================================================================================      |  95%   32 MB
|=================================================================================================================================      |  95%   32 MB
|==================================================================================================================================     |  95%   33 MB
|==================================================================================================================================     |  95%   33 MB
|==================================================================================================================================     |  96%   33 MB
|===================================================================================================================================    |  96%   33 MB
|===================================================================================================================================    |  96%   33 MB
|===================================================================================================================================    |  96%   33 MB
|====================================================================================================================================   |  97%   33 MB
|====================================================================================================================================   |  97%   33 MB
|====================================================================================================================================   |  97%   33 MB
|=====================================================================================================================================  |  97%   33 MB
|=====================================================================================================================================  |  98%   33 MB
|=====================================================================================================================================  |  98%   33 MB
|====================================================================================================================================== |  98%   34 MB
|====================================================================================================================================== |  98%   34 MB
|====================================================================================================================================== |  99%   34 MB
|=======================================================================================================================================|  99%   34 MB
|=======================================================================================================================================|  99%   34 MB
|=======================================================================================================================================|  99%   34 MB
|========================================================================================================================================| 100%   34 MB
NOC <- read_csv("NOC_regions.csv")
GDP <- read_csv("gdp_pop.csv")
#NOC's listed for Singapore do not match across athletes and NOC datasets
athletes$NOC[athletes$NOC=="SGP"] <- "SIN"
#merge all three datasets, keeping all observations in olympic
olympic <-athletes %>%
  left_join(NOC, by = "NOC") %>%
  left_join(GDP, c("NOC" = "Code"))
#rename variables
colnames(olympic) <- c("athlete_ID", "name", "sex", "age", "height", "weight", 
             "team", "NOC", "games", "year", "season", "city", "sport",
             "event", "medal", "region", "country_notes", "country", 
             "pop", "GDP_per_capita")
#separate all country=="NA" observations from olympic
olympic_NA <- olympic[is.na(olympic$country),]
olympic <- olympic[!is.na(olympic$country),]
#Rename some countries in the GDP and olympic datasets to match each other
GDP$Country[GDP$Country=="Trinidad and Tobago"] <- "Trinidad"
olympic_NA$region[olympic_NA$region=="Kosovo"] <- "Serbia"
GDP$country <- GDP$Country
#left_join olympic_NA with GDP, merge on region/Country
olympic_NA <- olympic_NA %>%
  select(-c(country, pop, GDP_per_capita)) %>%
  left_join(GDP, c("region" = "Country"))
#combine observations in olympic_NA and olympic
olympic_NA$Code <- NULL
#country <- rep("NA", nrow(olympic_NA))
#olympic_NA <- cbind(olympic_NA, country)
colnames(olympic_NA) <- c("athlete_ID", "name", "sex", "age", "height", "weight", 
                       "team", "NOC", "games", "year", "season", "city", "sport",
                       "event", "medal", "region", "country_notes", "pop",
                       "GDP_per_capita", "country")
olympic <- rbind(olympic_NA, olympic)

1b)

Graph 1

Bar plot comparing number of medals won by men and women in the top ten medal-winning countries:

How many games has each country competed in?

#subset olympic data to include only summer olympics
summer_olympics <- subset(olympic, season =="Summer")
#find number of summer games each country has competed in
games_per_country <- summer_olympics %>%
  group_by(country) %>%
  summarize(games_competed = n_distinct(games)) %>%
  arrange(desc(games_competed))

How many medals of each type does each country have?

summer_olympics <- summer_olympics[,c(10, 20, 15, 1:9, 11:14, 16:19)]
olympic_medals <- summer_olympics %>%
  filter(medal == "Gold"| medal == "Silver" | medal == "Bronze")
medals_by_MF <- olympic_medals %>%
  group_by(country, sex, medal) %>%
  summarize(count=n()) %>%
  spread(key = medal, value = count)
colnames(medals_by_MF) <- c("country", "sex", "bronze", "gold", "silver")
medals_by_MF$all_medals <- rowSums(
  medals_by_MF[,c("bronze", "silver", "gold")], na.rm=TRUE)

Here’s a list of the ten countries with the most number of medals throughout the entire time period.

medals_by_country <- medals_by_MF %>%
  group_by(country) %>%
  summarise(country_total = sum(all_medals))
medals_by_country <- left_join(medals_by_MF, medals_by_country, 
                               by = "country")
most_medals <- medals_by_country %>%
  arrange(desc(country_total)) %>%
  head(20)
top_countries <- unique(most_medals$country)

Make a bar graph showing the total number of medals won per country, by gender.

top_medals <- subset(olympic_medals, country %in% top_countries)
library(plotly)
library(ggthemes)
p1 <- ggplot(top_medals, aes(country, fill=sex)) 
plot1 <- p1 + geom_bar(position="dodge", width = 0.8) + 
  geom_bar(position="dodge", data=filter(top_medals, country=="United States"), 
           color="hot pink", size = 0.8) +
  coord_flip() + theme_tufte()+ scale_fill_hc() +
  theme(legend.title = element_blank()) +
  scale_x_discrete(limits = rev(top_countries)) + 
    labs(title = "Historic Gender Gap in Total Summer Olympic Medals Received",
       caption = "Source: International Olympic Committee", 
       y = "Medals Received Since 1896", x = "", fill="Sex")
ggplotly(plot1)

Graph 2

Interactive line graph comparing number of medals won by men and women in the top ten medal-winning countries, across years:

First, some data manipulation is needed:

#create dataset that includes the number of medals by year, country, and sex for the top 10 countries.
top_medals_yr <- top_medals %>%
  group_by(country, medal, sex, year) %>%
  summarize(count=n())                %>%
  spread(key = medal, value = count)
colnames(top_medals_yr) <- c("country", "sex", "year", "bronze", "gold", "silver")
top_medals_yr$all_medals <- rowSums(
  top_medals_yr[,c("bronze", "silver", "gold")], na.rm=TRUE)
#create a new dataset with a column for the number of medals total per country per year.
top_medals_country <- top_medals_yr %>%
  group_by(country, year) %>%
  summarise(country_total = sum(all_medals))
#join the new total medals column to the dataset.
most_medals_yr<- left_join(top_medals_yr, top_medals_country, 
                               by = c("country", "year"))
#create new variable to highlight the US in the graph.
most_medals_yr <- most_medals_yr %>%
  mutate(is_US = case_when(
    country == "United States" ~ "United States",
    TRUE ~ country )
    )
#create new variable that the plot will be grouped by.
most_medals_yr$country_sex <- paste(most_medals_yr$country, most_medals_yr$sex)

Here is the line plot the number of male and female medals in the top 10 countries across all summer games.

facet_names <- c(`F` = "Female", `M` = "Male")
p2 <- ggplot(most_medals_yr, aes(x = year, y = all_medals))
plot2 <- p2 + geom_line(aes(group = country_sex, color=country, size = is_US)) +
  scale_size_manual(values = c(.3, .3,.3,.3,.3,.3,.3,.3,.3, 1)) +
  theme(legend.position = "top") +
  labs(title = "Diminishing Gender Gap in Medal Counts",
       caption = "Source: International Olympic Committee", x="Year", y="Number of Summer Olympic Medals", 
       size = "Top Ten Countries", color = NULL) +
  facet_grid(~sex, labeller = as_labeller(facet_names)) +
  theme_hc() 
ggplotly(plot2)

Discussion

I recommend using the line graph because it shows the historic trend instead of just adding all medal earnings together across all years. From the line graph, we can see that the discrepancy between men and women seems to be getting smaller, but on the bar graph, we can only see that women have received fewer medals across all years.

2. Medal Counts adjusted by Population, GDP

I will use the total number of medals a country has earned to rank countries separately by raw medal earnings, adjusted by population, and adjusted by GDP.

# subset data to 2016 data, and generate a count of all medals earned by each country
medals_2016 <- summer_olympics %>%
  filter(year == 2016, !is.na(medal), !is.na(country))
medal_counts_2016 <- medals_2016 %>%
  group_by(country) %>%
  summarise(medal_count = n())
#create a dataset of country gdps and populations from the summer_olympics dataset
gdp_pop <- summer_olympics %>%
  select(country, pop, GDP_per_capita) %>%
  filter(!is.na(country)) %>%
  unique()
#merge gdp_pop and medal_counts_2016 by country, keeping only those countries that have won medals.
medal_rankings_2016 <- left_join(medal_counts_2016, gdp_pop, by = "country")
#create country ranking based purely on the raw medal counts.
medal_rankings_2016 <- medal_rankings_2016 %>%
  arrange(desc(medal_count))
medal_rankings_2016$raw_rankings <- c(1:84)
#create country ranking based on population.
medal_rankings_2016$medal_by_pop <- medal_rankings_2016$medal_count/medal_rankings_2016$pop
medal_rankings_2016 <- medal_rankings_2016 %>%
  arrange(desc(medal_by_pop))
medal_rankings_2016$by_pop_rankings <- c(1:84)
#create country ranking based on GDP_per_capita.
medal_rankings_2016$medal_by_GDP <- medal_rankings_2016$medal_count/medal_rankings_2016$GDP_per_capita
medal_rankings_2016 <- medal_rankings_2016 %>%
  arrange(desc(medal_by_GDP))
medal_rankings_2016$by_GDP_rankings <- c(1:84)
#reduce the dataset down to 10 countries that rank first in the raw, unadjusted rankings
top_10 <- c(1:10)
  
top_10_rankings <- medal_rankings_2016 %>%
  filter(raw_rankings %in% top_10) %>%
  arrange(raw_rankings) %>%
  gather("by_GDP_rankings", "by_pop_rankings", "raw_rankings",key = "rank_type", value = "rank")
top_10_rankings$order <- rev(top_10_rankings$rank[21:30])
top_10_rankings <- top_10_rankings %>%
  mutate(rank_type = case_when(
    rank_type == "by_GDP_rankings" ~ "Adjusted: GDP per Capita",
    rank_type == "by_pop_rankings" ~ "Adjusted: Population",
    rank_type == "raw_rankings" ~ "Unadjusted Ranking",
  ))
#plot the relative rankings of the top 10 raw ranking countries.
p3 <- ggplot(filter(top_10_rankings), aes(x = rank, y = reorder(country, order), color = rank_type))
p3 + geom_point(size = 4) +
  theme_hc()+ scale_colour_hc() +
  labs( x = "Ranking out of 84 Countries", y = "", caption = "Data Source: International Olympic Committee", 
        title = "Olympic Rankings of Top 10 Countries Decrease Post-Adjustments", color = "Rank Type") +
  guides(color = guide_legend(reverse=TRUE))

3. Host Country Advantage

#obtain a list of host cities and countries by year
library(rvest)
library(stringr)
wiki_hosts <- read_html("https://en.wikipedia.org/wiki/Summer_Olympic_Games")
hosts <- html_table(html_nodes(wiki_hosts, "table")[[8]], fill=TRUE)
hosts <- hosts[-1,1:3]
hosts$city <- str_split_fixed(hosts$Host, n=2, ",")[,1]
hosts$country <- str_split_fixed(hosts$Host, n=2, ",")[,2]
names(hosts) <- c("olympiad", "year", "host", "host_city", "host_country")
hosts <- hosts[, c(2, 4, 5)]

#merge host data with summer_olympics data
hosts$host_country <- trimws(hosts$host_country)

hosts <- hosts %>%
  mutate(host_country = case_when(
    host_country == "West Germany" ~ "Germany",
    host_country == "Soviet Union" ~ "Russia",
    host_country == "South Korea" ~ "Korea, South",
    TRUE ~ host_country
  ))

hosts$year <- as.numeric(hosts$year)

host_advantage <- summer_olympics %>%
  left_join(hosts, by = "year") 

#subset data by only the countries that have hosted, and only observations where a medal has been earned
host_advantage <- subset(host_advantage, country %in% hosts$host_country & !is.na(medal))

#make a new dataset with relevant variables, including whether a country was the host for each observation.
host_advantage <- host_advantage %>%
  mutate( is_host = case_when(
    country==host_country ~ "Host Country",
    TRUE ~ "Visiting Country"
  ))
host_countries_df <- host_advantage[, c(1:3, 23)]

#get count of medals for each country each year
host_countries_df <- host_countries_df %>%
  group_by(is_host, year, country) %>%
  summarise(medal_count = n()) %>%
  arrange(desc(year))

#get average medals per country for visiting countries
visitor_averages <- host_countries_df %>%
  subset(is_host == "Visiting Country") %>%
  group_by(country) %>%
  summarise(visitor_average = sum(medal_count)/n())

#get average medals per country for host countries
host_averages <- host_countries_df %>%
  subset(is_host == "Host Country") %>%
  group_by(country) %>%
  summarise(host_average = sum(medal_count)/n())

#merge the host and visitor averages into one dataset
country_average <- left_join(visitor_averages, host_averages, by = "country")
country_averages <- country_average %>%
  gather("visitor_average", "host_average", key = "is_host", value = "medal_count") %>%
  mutate(is_host = case_when(
    is_host =="visitor_average" ~ "Visitor",
    TRUE ~ "Host"
  ))

p4 <- ggplot(country_averages, aes(x=country, y=medal_count, fill=is_host))
plot4 <- p4 + geom_bar(position = "dodge", stat="identity", width = 0.8) +
  geom_bar(position="dodge", stat="identity", data=filter(country_averages, country=="Belgium"), 
           color="hot pink", size = 0.8) +
  coord_flip() + theme_tufte() + scale_fill_hc() +
  labs(title = "Belgium Wins 17 Times More Medals as Host than as Visitor", 
       caption = "Data Source: International Olympic Committee",
       y = "Average Medals Won Per Game", x = "", fill="", color="")
plot4

I’m not sure why the plot for number 3 isn’t showing up in the knitted file even though it is produced in the rmd file. I posted this question on Piazza and tried troubleshooting it both myself and with the help of the TA, but it did not work. Please look in the rmd file to see the plot.

4. Most Successful Athletes

4a)

First make a dataset that includes the top 10 most successful athletes and the medals they have won. Then plot them on a bar plot that shows the number of medals they have and where they are from.

#get a dataset of individuals with the number of medals they have to determine who the most successful athletes are.
indiv_medals <- summer_olympics %>%
  mutate(athlete = paste(name, ":", country)) %>%
  filter(!is.na(medal))
indiv_medals2 <- indiv_medals %>%
  group_by(athlete) %>%
  summarise(medal_count = n()) %>%
  arrange(desc(medal_count))
best_athletes <- head(indiv_medals2, 14)
best_athletes$rank <- c(1:14)
# subset the individual medals dataset to include only the top 10 athletes.
best_athletes_df <- subset(indiv_medals, indiv_medals$athlete %in% best_athletes$athlete)
best_athletes_df <- best_athletes_df %>%
  mutate(name = case_when(
    name=="Larysa Semenivna Latynina (Diriy-)" ~ "Larysa Semenivna Latynina",
    name=="Dara Grace Torres (-Hoffman, -Minas)" ~ "Dara Grace Torres",
    name=="Jennifer Elisabeth \"Jenny\" Thompson (-Cumpelik)" ~"Jennifer Elisabeth Thompson",
    name=="Natalie Anne Coughlin (-Hall)" ~"Natalie Anne Coughlin",
    TRUE ~ name
  ))
best_athletes_df <- best_athletes_df %>%
  left_join(best_athletes, by = "athlete") %>%
  arrange(rank)
  
#plot the 10 most successful athletes using a barplot that shows how many medals they have won.
p5 <- ggplot(best_athletes_df, aes(x = reorder(name, rev(rank))))
plot5 <- p5 + geom_bar(fill="light blue", width=0.6) +
  theme_tufte() +
  coord_flip() + labs(x="", y = "Total Number of Medals Awarded", 
                      title = "Most Successful Athletes Since 1896",
                      caption="Data Source: International Olympic Committee")
plot5

4b)

The graph below shows that among the top athletes, those from the same country tend to win medals in the same sports.

best_athletes_df$athlete <- paste(best_athletes_df$name, "[", best_athletes_df$country, "]")
p5 <- ggplot(best_athletes_df, aes(x = reorder(name, rev(rank)),  fill=sport))
plot5 <- p5 + geom_bar(width=0.8) +
  coord_flip() + labs(x="", y = "Total Number of Medals Awarded", 
                      title = "Most Successful Athletes Since 1896",
                      caption="Data Source: International Olympic Committee",
                      fill="") +
  scale_fill_manual(values=c("cadetblue2", "khaki1", "green4", 
                             "indianred2", "hotpink4", "darkblue")) +
  facet_grid(country~ . , scales="free_y", space="free") + 
  theme_pander() + theme(strip.text.y = element_text(angle = 0)) 
plot5

5. Make Two Plots Interactive

I added interactivity to the two plots in question number 1.

Interactivity is helpful in the bar graph because it allows users to select by sex. Doing so clears up the clutter from having two sets of bars for each country. Additionally, users can also hover over any bar and see the medal count for that bar.

Interactivity is helpful in the line graph because while the static plot would give the reader a sense of the overall trend across all countries, making it interactive will allow the reader to select which countries he wants to look at. Especially with multiple spaghetti lines in different colors, it is difficult to see each line without making it interactive. The interactivity also allows readers to hover over any data point and see the exact number of medals associated with that data point.

6. Data Table

I would like to include information about unadjusted rankings based on medal counts, as well as adjusted rankings based on GDP and on population. I think it is informative because usually we only see the total number of medals a country wins. But countries with low unadjusted rankings and higher adjusted rankings also deserve a spotlight. I have allowed sorting so that users can see how countries that rank high in one measure holds up in another measure. Filters are also available for users who want to filter by country or by a ranking. The data for medal counts, population, and GDP per capita are also kept in the dataset in case users want to look deeper into the data.

#make a dataset with adjustments based on the 2016 medal rankings dataset.
#show NA's as -- for by_pop_rankings and by_GDP_rankings
for (i in seq_along(medal_rankings_2016$pop)){
  if (is.na(medal_rankings_2016$pop[i])) {
    medal_rankings_2016$by_pop_rankings[i] <- "--"
  }
}
for (i in seq_along(medal_rankings_2016$GDP_per_capita)){
  if (is.na(medal_rankings_2016$GDP_per_capita[i])) {
    medal_rankings_2016$by_GDP_rankings[i] <- "--"
  }
}
#drop irrelevant columns and round GDP_per_capita
medal_rankings_dt <- medal_rankings_2016[, c(1, 5,7,9,2,3,4)]
medal_rankings_dt$GDP_per_capita <- lapply(medal_rankings_dt$GDP_per_capita, round, 2)
#show GDP_per_capita and pop na values as --.
for (i in seq_along(medal_rankings_dt$GDP_per_capita)){
  if (is.na(medal_rankings_dt$GDP_per_capita[i])) {
    medal_rankings_dt$GDP_per_capita[i] <- "--"
  }
}
for (i in seq_along(medal_rankings_dt$pop)){
  if (is.na(medal_rankings_dt$pop[i])) {
     medal_rankings_dt$pop[i] <- "--"
  }
}
#Take out Taiwan sinceneither population nor  GDP per Capita data is available to compare.
medal_rankings_dt <- medal_rankings_dt %>%
  subset(country!="Taiwan")
#Make the headers for each column
dt_headers <- c("Country",  "Unadjusted Ranking", "Ranking Adjusted by Population", "Ranking Adjusted by GDP per Capita",
                "Total Medal Count", "Population", "GDP per Capita ($)")
#Make the datatable
library(DT)
datatable(medal_rankings_dt, rownames=FALSE, colnames=dt_headers,
          filter=list(position="top"), options = list(columnDefs = list(list(className = 'dt-right', targets = 0:6))
                                                      )
          )
LS0tDQp0aXRsZTogIkRhdGEgVmlzdWFsaXphdGlvbiBBc3NpZ25tZW50IDEiDQphdXRob3I6IFllIChFdmVseW4pIERlbmcNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzMnDQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDMNCi0tLQ0KYGBge3J9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NSkgDQoNCmBgYA0KDQojIDEuIE1lZGFsIENvdW50cyBvdmVyIFRpbWUNCiMjMWEpIE1lcmdlIGFsbCBkYXRhIGludG8gb25lIGRhdGFzZXQgbmFtZWQgIm9seW1waWMiLg0KYGBge3IgbWVzc2FnZT1GQUxTRX0NCiNsb2FkIHJlbGV2YW50IHBhY2thZ2VzIA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCiNyZWFkIGluIGFsbCB0aHJlZSBkYXRhIGZpbGVzDQphdGhsZXRlcyA8LSByZWFkX2NzdigiYXRobGV0ZXNfYW5kX2V2ZW50cy5jc3YiKQ0KTk9DIDwtIHJlYWRfY3N2KCJOT0NfcmVnaW9ucy5jc3YiKQ0KR0RQIDwtIHJlYWRfY3N2KCJnZHBfcG9wLmNzdiIpDQoNCiNOT0MncyBsaXN0ZWQgZm9yIFNpbmdhcG9yZSBkbyBub3QgbWF0Y2ggYWNyb3NzIGF0aGxldGVzIGFuZCBOT0MgZGF0YXNldHMNCmF0aGxldGVzJE5PQ1thdGhsZXRlcyROT0M9PSJTR1AiXSA8LSAiU0lOIg0KDQojbWVyZ2UgYWxsIHRocmVlIGRhdGFzZXRzLCBrZWVwaW5nIGFsbCBvYnNlcnZhdGlvbnMgaW4gb2x5bXBpYw0Kb2x5bXBpYyA8LWF0aGxldGVzICU+JQ0KICBsZWZ0X2pvaW4oTk9DLCBieSA9ICJOT0MiKSAlPiUNCiAgbGVmdF9qb2luKEdEUCwgYygiTk9DIiA9ICJDb2RlIikpDQoNCiNyZW5hbWUgdmFyaWFibGVzDQpjb2xuYW1lcyhvbHltcGljKSA8LSBjKCJhdGhsZXRlX0lEIiwgIm5hbWUiLCAic2V4IiwgImFnZSIsICJoZWlnaHQiLCAid2VpZ2h0IiwgDQogICAgICAgICAgICAgInRlYW0iLCAiTk9DIiwgImdhbWVzIiwgInllYXIiLCAic2Vhc29uIiwgImNpdHkiLCAic3BvcnQiLA0KICAgICAgICAgICAgICJldmVudCIsICJtZWRhbCIsICJyZWdpb24iLCAiY291bnRyeV9ub3RlcyIsICJjb3VudHJ5IiwgDQogICAgICAgICAgICAgInBvcCIsICJHRFBfcGVyX2NhcGl0YSIpDQoNCiNzZXBhcmF0ZSBhbGwgY291bnRyeT09Ik5BIiBvYnNlcnZhdGlvbnMgZnJvbSBvbHltcGljDQpvbHltcGljX05BIDwtIG9seW1waWNbaXMubmEob2x5bXBpYyRjb3VudHJ5KSxdDQpvbHltcGljIDwtIG9seW1waWNbIWlzLm5hKG9seW1waWMkY291bnRyeSksXQ0KDQojUmVuYW1lIHNvbWUgY291bnRyaWVzIGluIHRoZSBHRFAgYW5kIG9seW1waWMgZGF0YXNldHMgdG8gbWF0Y2ggZWFjaCBvdGhlcg0KR0RQJENvdW50cnlbR0RQJENvdW50cnk9PSJUcmluaWRhZCBhbmQgVG9iYWdvIl0gPC0gIlRyaW5pZGFkIg0Kb2x5bXBpY19OQSRyZWdpb25bb2x5bXBpY19OQSRyZWdpb249PSJLb3Nvdm8iXSA8LSAiU2VyYmlhIg0KDQpHRFAkY291bnRyeSA8LSBHRFAkQ291bnRyeQ0KDQojbGVmdF9qb2luIG9seW1waWNfTkEgd2l0aCBHRFAsIG1lcmdlIG9uIHJlZ2lvbi9Db3VudHJ5DQpvbHltcGljX05BIDwtIG9seW1waWNfTkEgJT4lDQogIHNlbGVjdCgtYyhjb3VudHJ5LCBwb3AsIEdEUF9wZXJfY2FwaXRhKSkgJT4lDQogIGxlZnRfam9pbihHRFAsIGMoInJlZ2lvbiIgPSAiQ291bnRyeSIpKQ0KDQojY29tYmluZSBvYnNlcnZhdGlvbnMgaW4gb2x5bXBpY19OQSBhbmQgb2x5bXBpYw0Kb2x5bXBpY19OQSRDb2RlIDwtIE5VTEwNCiNjb3VudHJ5IDwtIHJlcCgiTkEiLCBucm93KG9seW1waWNfTkEpKQ0KI29seW1waWNfTkEgPC0gY2JpbmQob2x5bXBpY19OQSwgY291bnRyeSkNCg0KY29sbmFtZXMob2x5bXBpY19OQSkgPC0gYygiYXRobGV0ZV9JRCIsICJuYW1lIiwgInNleCIsICJhZ2UiLCAiaGVpZ2h0IiwgIndlaWdodCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAidGVhbSIsICJOT0MiLCAiZ2FtZXMiLCAieWVhciIsICJzZWFzb24iLCAiY2l0eSIsICJzcG9ydCIsDQogICAgICAgICAgICAgICAgICAgICAgICJldmVudCIsICJtZWRhbCIsICJyZWdpb24iLCAiY291bnRyeV9ub3RlcyIsICJwb3AiLA0KICAgICAgICAgICAgICAgICAgICAgICAiR0RQX3Blcl9jYXBpdGEiLCAiY291bnRyeSIpDQoNCm9seW1waWMgPC0gcmJpbmQob2x5bXBpY19OQSwgb2x5bXBpYykNCmBgYA0KDQojIzFiKQ0KIyMjR3JhcGggMQ0KQmFyIHBsb3QgY29tcGFyaW5nIG51bWJlciBvZiBtZWRhbHMgd29uIGJ5IG1lbiBhbmQgd29tZW4gaW4gdGhlIHRvcCB0ZW4gbWVkYWwtd2lubmluZyBjb3VudHJpZXM6DQoNCkhvdyBtYW55IGdhbWVzIGhhcyBlYWNoIGNvdW50cnkgY29tcGV0ZWQgaW4/DQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KI3N1YnNldCBvbHltcGljIGRhdGEgdG8gaW5jbHVkZSBvbmx5IHN1bW1lciBvbHltcGljcw0Kc3VtbWVyX29seW1waWNzIDwtIHN1YnNldChvbHltcGljLCBzZWFzb24gPT0iU3VtbWVyIikNCg0KI2ZpbmQgbnVtYmVyIG9mIHN1bW1lciBnYW1lcyBlYWNoIGNvdW50cnkgaGFzIGNvbXBldGVkIGluDQpnYW1lc19wZXJfY291bnRyeSA8LSBzdW1tZXJfb2x5bXBpY3MgJT4lDQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQ0KICBzdW1tYXJpemUoZ2FtZXNfY29tcGV0ZWQgPSBuX2Rpc3RpbmN0KGdhbWVzKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhnYW1lc19jb21wZXRlZCkpDQpgYGANCg0KSG93IG1hbnkgbWVkYWxzIG9mIGVhY2ggdHlwZSBkb2VzIGVhY2ggY291bnRyeSBoYXZlPw0KYGBge3IgbWVzc2FnZT1GQUxTRX0NCnN1bW1lcl9vbHltcGljcyA8LSBzdW1tZXJfb2x5bXBpY3NbLGMoMTAsIDIwLCAxNSwgMTo5LCAxMToxNCwgMTY6MTkpXQ0Kb2x5bXBpY19tZWRhbHMgPC0gc3VtbWVyX29seW1waWNzICU+JQ0KICBmaWx0ZXIobWVkYWwgPT0gIkdvbGQifCBtZWRhbCA9PSAiU2lsdmVyIiB8IG1lZGFsID09ICJCcm9uemUiKQ0KDQptZWRhbHNfYnlfTUYgPC0gb2x5bXBpY19tZWRhbHMgJT4lDQogIGdyb3VwX2J5KGNvdW50cnksIHNleCwgbWVkYWwpICU+JQ0KICBzdW1tYXJpemUoY291bnQ9bigpKSAlPiUNCiAgc3ByZWFkKGtleSA9IG1lZGFsLCB2YWx1ZSA9IGNvdW50KQ0KDQpjb2xuYW1lcyhtZWRhbHNfYnlfTUYpIDwtIGMoImNvdW50cnkiLCAic2V4IiwgImJyb256ZSIsICJnb2xkIiwgInNpbHZlciIpDQoNCm1lZGFsc19ieV9NRiRhbGxfbWVkYWxzIDwtIHJvd1N1bXMoDQogIG1lZGFsc19ieV9NRlssYygiYnJvbnplIiwgInNpbHZlciIsICJnb2xkIildLCBuYS5ybT1UUlVFKQ0KDQpgYGANCg0KSGVyZSdzIGEgbGlzdCBvZiB0aGUgdGVuIGNvdW50cmllcyB3aXRoIHRoZSBtb3N0IG51bWJlciBvZiBtZWRhbHMgdGhyb3VnaG91dCB0aGUgZW50aXJlIHRpbWUgcGVyaW9kLg0KYGBge3IgbWVzc2FnZT1GQUxTRX0NCm1lZGFsc19ieV9jb3VudHJ5IDwtIG1lZGFsc19ieV9NRiAlPiUNCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lDQogIHN1bW1hcmlzZShjb3VudHJ5X3RvdGFsID0gc3VtKGFsbF9tZWRhbHMpKQ0KDQptZWRhbHNfYnlfY291bnRyeSA8LSBsZWZ0X2pvaW4obWVkYWxzX2J5X01GLCBtZWRhbHNfYnlfY291bnRyeSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAiY291bnRyeSIpDQoNCm1vc3RfbWVkYWxzIDwtIG1lZGFsc19ieV9jb3VudHJ5ICU+JQ0KICBhcnJhbmdlKGRlc2MoY291bnRyeV90b3RhbCkpICU+JQ0KICBoZWFkKDIwKQ0KDQp0b3BfY291bnRyaWVzIDwtIHVuaXF1ZShtb3N0X21lZGFscyRjb3VudHJ5KQ0KDQpgYGANCg0KTWFrZSBhIGJhciBncmFwaCBzaG93aW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgbWVkYWxzIHdvbiBwZXIgY291bnRyeSwgYnkgZ2VuZGVyLg0KYGBge3J9DQp0b3BfbWVkYWxzIDwtIHN1YnNldChvbHltcGljX21lZGFscywgY291bnRyeSAlaW4lIHRvcF9jb3VudHJpZXMpDQoNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShnZ3RoZW1lcykNCg0KcDEgPC0gZ2dwbG90KHRvcF9tZWRhbHMsIGFlcyhjb3VudHJ5LCBmaWxsPXNleCkpIA0KcGxvdDEgPC0gcDEgKyBnZW9tX2Jhcihwb3NpdGlvbj0iZG9kZ2UiLCB3aWR0aCA9IDAuOCkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb249ImRvZGdlIiwgZGF0YT1maWx0ZXIodG9wX21lZGFscywgY291bnRyeT09IlVuaXRlZCBTdGF0ZXMiKSwgDQogICAgICAgICAgIGNvbG9yPSJob3QgcGluayIsIHNpemUgPSAwLjgpICsNCiAgY29vcmRfZmxpcCgpICsgdGhlbWVfdHVmdGUoKSsgc2NhbGVfZmlsbF9oYygpICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcmV2KHRvcF9jb3VudHJpZXMpKSArIA0KICAgIGxhYnModGl0bGUgPSAiSGlzdG9yaWMgR2VuZGVyIEdhcCBpbiBUb3RhbCBTdW1tZXIgT2x5bXBpYyBNZWRhbHMgUmVjZWl2ZWQiLA0KICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBJbnRlcm5hdGlvbmFsIE9seW1waWMgQ29tbWl0dGVlIiwgDQogICAgICAgeSA9ICJNZWRhbHMgUmVjZWl2ZWQgU2luY2UgMTg5NiIsIHggPSAiIiwgZmlsbD0iU2V4IikNCg0KZ2dwbG90bHkocGxvdDEpDQpgYGANCg0KIyMjR3JhcGggMg0KSW50ZXJhY3RpdmUgbGluZSBncmFwaCBjb21wYXJpbmcgbnVtYmVyIG9mIG1lZGFscyB3b24gYnkgbWVuIGFuZCB3b21lbiBpbiB0aGUgdG9wIHRlbiBtZWRhbC13aW5uaW5nIGNvdW50cmllcywgYWNyb3NzIHllYXJzOg0KDQpGaXJzdCwgc29tZSBkYXRhIG1hbmlwdWxhdGlvbiBpcyBuZWVkZWQ6DQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KI2NyZWF0ZSBkYXRhc2V0IHRoYXQgaW5jbHVkZXMgdGhlIG51bWJlciBvZiBtZWRhbHMgYnkgeWVhciwgY291bnRyeSwgYW5kIHNleCBmb3IgdGhlIHRvcCAxMCBjb3VudHJpZXMuDQp0b3BfbWVkYWxzX3lyIDwtIHRvcF9tZWRhbHMgJT4lDQogIGdyb3VwX2J5KGNvdW50cnksIG1lZGFsLCBzZXgsIHllYXIpICU+JQ0KICBzdW1tYXJpemUoY291bnQ9bigpKSAgICAgICAgICAgICAgICAlPiUNCiAgc3ByZWFkKGtleSA9IG1lZGFsLCB2YWx1ZSA9IGNvdW50KQ0KDQpjb2xuYW1lcyh0b3BfbWVkYWxzX3lyKSA8LSBjKCJjb3VudHJ5IiwgInNleCIsICJ5ZWFyIiwgImJyb256ZSIsICJnb2xkIiwgInNpbHZlciIpDQoNCnRvcF9tZWRhbHNfeXIkYWxsX21lZGFscyA8LSByb3dTdW1zKA0KICB0b3BfbWVkYWxzX3lyWyxjKCJicm9uemUiLCAic2lsdmVyIiwgImdvbGQiKV0sIG5hLnJtPVRSVUUpDQoNCiNjcmVhdGUgYSBuZXcgZGF0YXNldCB3aXRoIGEgY29sdW1uIGZvciB0aGUgbnVtYmVyIG9mIG1lZGFscyB0b3RhbCBwZXIgY291bnRyeSBwZXIgeWVhci4NCnRvcF9tZWRhbHNfY291bnRyeSA8LSB0b3BfbWVkYWxzX3lyICU+JQ0KICBncm91cF9ieShjb3VudHJ5LCB5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50cnlfdG90YWwgPSBzdW0oYWxsX21lZGFscykpDQoNCiNqb2luIHRoZSBuZXcgdG90YWwgbWVkYWxzIGNvbHVtbiB0byB0aGUgZGF0YXNldC4NCm1vc3RfbWVkYWxzX3lyPC0gbGVmdF9qb2luKHRvcF9tZWRhbHNfeXIsIHRvcF9tZWRhbHNfY291bnRyeSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHJ5IiwgInllYXIiKSkNCg0KI2NyZWF0ZSBuZXcgdmFyaWFibGUgdG8gaGlnaGxpZ2h0IHRoZSBVUyBpbiB0aGUgZ3JhcGguDQptb3N0X21lZGFsc195ciA8LSBtb3N0X21lZGFsc195ciAlPiUNCiAgbXV0YXRlKGlzX1VTID0gY2FzZV93aGVuKA0KICAgIGNvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiIH4gIlVuaXRlZCBTdGF0ZXMiLA0KICAgIFRSVUUgfiBjb3VudHJ5ICkNCiAgICApDQoNCiNjcmVhdGUgbmV3IHZhcmlhYmxlIHRoYXQgdGhlIHBsb3Qgd2lsbCBiZSBncm91cGVkIGJ5Lg0KbW9zdF9tZWRhbHNfeXIkY291bnRyeV9zZXggPC0gcGFzdGUobW9zdF9tZWRhbHNfeXIkY291bnRyeSwgbW9zdF9tZWRhbHNfeXIkc2V4KQ0KYGBgDQoNCkhlcmUgaXMgdGhlIGxpbmUgcGxvdCB0aGUgbnVtYmVyIG9mIG1hbGUgYW5kIGZlbWFsZSBtZWRhbHMgaW4gdGhlIHRvcCAxMCBjb3VudHJpZXMgYWNyb3NzIGFsbCBzdW1tZXIgZ2FtZXMuDQpgYGB7cn0NCmZhY2V0X25hbWVzIDwtIGMoYEZgID0gIkZlbWFsZSIsIGBNYCA9ICJNYWxlIikNCg0KcDIgPC0gZ2dwbG90KG1vc3RfbWVkYWxzX3lyLCBhZXMoeCA9IHllYXIsIHkgPSBhbGxfbWVkYWxzKSkNCg0KcGxvdDIgPC0gcDIgKyBnZW9tX2xpbmUoYWVzKGdyb3VwID0gY291bnRyeV9zZXgsIGNvbG9yPWNvdW50cnksIHNpemUgPSBpc19VUykpICsNCiAgc2NhbGVfc2l6ZV9tYW51YWwodmFsdWVzID0gYyguMywgLjMsLjMsLjMsLjMsLjMsLjMsLjMsLjMsIDEpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArDQogIGxhYnModGl0bGUgPSAiRGltaW5pc2hpbmcgR2VuZGVyIEdhcCBpbiBNZWRhbCBDb3VudHMiLA0KICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBJbnRlcm5hdGlvbmFsIE9seW1waWMgQ29tbWl0dGVlIiwgeD0iWWVhciIsIHk9Ik51bWJlciBvZiBTdW1tZXIgT2x5bXBpYyBNZWRhbHMiLCANCiAgICAgICBzaXplID0gIlRvcCBUZW4gQ291bnRyaWVzIiwgY29sb3IgPSBOVUxMKSArDQogIGZhY2V0X2dyaWQofnNleCwgbGFiZWxsZXIgPSBhc19sYWJlbGxlcihmYWNldF9uYW1lcykpICsNCiAgdGhlbWVfaGMoKSANCg0KZ2dwbG90bHkocGxvdDIpDQoNCmBgYA0KDQojIyMgRGlzY3Vzc2lvbg0KSSByZWNvbW1lbmQgdXNpbmcgdGhlIGxpbmUgZ3JhcGggYmVjYXVzZSBpdCBzaG93cyB0aGUgaGlzdG9yaWMgdHJlbmQgaW5zdGVhZCBvZiBqdXN0IGFkZGluZyBhbGwgbWVkYWwgZWFybmluZ3MgdG9nZXRoZXIgYWNyb3NzIGFsbCB5ZWFycy4gRnJvbSB0aGUgbGluZSBncmFwaCwgd2UgY2FuIHNlZSB0aGF0IHRoZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIG1lbiBhbmQgd29tZW4gc2VlbXMgdG8gYmUgZ2V0dGluZyBzbWFsbGVyLCBidXQgb24gdGhlIGJhciBncmFwaCwgd2UgY2FuIG9ubHkgc2VlIHRoYXQgd29tZW4gaGF2ZSByZWNlaXZlZCBmZXdlciBtZWRhbHMgYWNyb3NzIGFsbCB5ZWFycy4NCg0KIzIuIE1lZGFsIENvdW50cyBhZGp1c3RlZCBieSBQb3B1bGF0aW9uLCBHRFANCg0KSSB3aWxsIHVzZSB0aGUgdG90YWwgbnVtYmVyIG9mIG1lZGFscyBhIGNvdW50cnkgaGFzIGVhcm5lZCB0byByYW5rIGNvdW50cmllcyBzZXBhcmF0ZWx5IGJ5IHJhdyBtZWRhbCBlYXJuaW5ncywgYWRqdXN0ZWQgYnkgcG9wdWxhdGlvbiwgYW5kIGFkanVzdGVkIGJ5IEdEUC4NCmBgYHtyfQ0KIyBzdWJzZXQgZGF0YSB0byAyMDE2IGRhdGEsIGFuZCBnZW5lcmF0ZSBhIGNvdW50IG9mIGFsbCBtZWRhbHMgZWFybmVkIGJ5IGVhY2ggY291bnRyeQ0KbWVkYWxzXzIwMTYgPC0gc3VtbWVyX29seW1waWNzICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDE2LCAhaXMubmEobWVkYWwpLCAhaXMubmEoY291bnRyeSkpDQptZWRhbF9jb3VudHNfMjAxNiA8LSBtZWRhbHNfMjAxNiAlPiUNCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lDQogIHN1bW1hcmlzZShtZWRhbF9jb3VudCA9IG4oKSkNCg0KI2NyZWF0ZSBhIGRhdGFzZXQgb2YgY291bnRyeSBnZHBzIGFuZCBwb3B1bGF0aW9ucyBmcm9tIHRoZSBzdW1tZXJfb2x5bXBpY3MgZGF0YXNldA0KZ2RwX3BvcCA8LSBzdW1tZXJfb2x5bXBpY3MgJT4lDQogIHNlbGVjdChjb3VudHJ5LCBwb3AsIEdEUF9wZXJfY2FwaXRhKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShjb3VudHJ5KSkgJT4lDQogIHVuaXF1ZSgpDQoNCiNtZXJnZSBnZHBfcG9wIGFuZCBtZWRhbF9jb3VudHNfMjAxNiBieSBjb3VudHJ5LCBrZWVwaW5nIG9ubHkgdGhvc2UgY291bnRyaWVzIHRoYXQgaGF2ZSB3b24gbWVkYWxzLg0KbWVkYWxfcmFua2luZ3NfMjAxNiA8LSBsZWZ0X2pvaW4obWVkYWxfY291bnRzXzIwMTYsIGdkcF9wb3AsIGJ5ID0gImNvdW50cnkiKQ0KDQojY3JlYXRlIGNvdW50cnkgcmFua2luZyBiYXNlZCBwdXJlbHkgb24gdGhlIHJhdyBtZWRhbCBjb3VudHMuDQptZWRhbF9yYW5raW5nc18yMDE2IDwtIG1lZGFsX3JhbmtpbmdzXzIwMTYgJT4lDQogIGFycmFuZ2UoZGVzYyhtZWRhbF9jb3VudCkpDQoNCm1lZGFsX3JhbmtpbmdzXzIwMTYkcmF3X3JhbmtpbmdzIDwtIGMoMTo4NCkNCg0KI2NyZWF0ZSBjb3VudHJ5IHJhbmtpbmcgYmFzZWQgb24gcG9wdWxhdGlvbi4NCm1lZGFsX3JhbmtpbmdzXzIwMTYkbWVkYWxfYnlfcG9wIDwtIG1lZGFsX3JhbmtpbmdzXzIwMTYkbWVkYWxfY291bnQvbWVkYWxfcmFua2luZ3NfMjAxNiRwb3ANCm1lZGFsX3JhbmtpbmdzXzIwMTYgPC0gbWVkYWxfcmFua2luZ3NfMjAxNiAlPiUNCiAgYXJyYW5nZShkZXNjKG1lZGFsX2J5X3BvcCkpDQoNCm1lZGFsX3JhbmtpbmdzXzIwMTYkYnlfcG9wX3JhbmtpbmdzIDwtIGMoMTo4NCkNCg0KI2NyZWF0ZSBjb3VudHJ5IHJhbmtpbmcgYmFzZWQgb24gR0RQX3Blcl9jYXBpdGEuDQptZWRhbF9yYW5raW5nc18yMDE2JG1lZGFsX2J5X0dEUCA8LSBtZWRhbF9yYW5raW5nc18yMDE2JG1lZGFsX2NvdW50L21lZGFsX3JhbmtpbmdzXzIwMTYkR0RQX3Blcl9jYXBpdGENCm1lZGFsX3JhbmtpbmdzXzIwMTYgPC0gbWVkYWxfcmFua2luZ3NfMjAxNiAlPiUNCiAgYXJyYW5nZShkZXNjKG1lZGFsX2J5X0dEUCkpDQoNCm1lZGFsX3JhbmtpbmdzXzIwMTYkYnlfR0RQX3JhbmtpbmdzIDwtIGMoMTo4NCkNCg0KI3JlZHVjZSB0aGUgZGF0YXNldCBkb3duIHRvIDEwIGNvdW50cmllcyB0aGF0IHJhbmsgZmlyc3QgaW4gdGhlIHJhdywgdW5hZGp1c3RlZCByYW5raW5ncw0KdG9wXzEwIDwtIGMoMToxMCkNCiAgDQp0b3BfMTBfcmFua2luZ3MgPC0gbWVkYWxfcmFua2luZ3NfMjAxNiAlPiUNCiAgZmlsdGVyKHJhd19yYW5raW5ncyAlaW4lIHRvcF8xMCkgJT4lDQogIGFycmFuZ2UocmF3X3JhbmtpbmdzKSAlPiUNCiAgZ2F0aGVyKCJieV9HRFBfcmFua2luZ3MiLCAiYnlfcG9wX3JhbmtpbmdzIiwgInJhd19yYW5raW5ncyIsa2V5ID0gInJhbmtfdHlwZSIsIHZhbHVlID0gInJhbmsiKQ0KDQp0b3BfMTBfcmFua2luZ3Mkb3JkZXIgPC0gcmV2KHRvcF8xMF9yYW5raW5ncyRyYW5rWzIxOjMwXSkNCg0KdG9wXzEwX3JhbmtpbmdzIDwtIHRvcF8xMF9yYW5raW5ncyAlPiUNCiAgbXV0YXRlKHJhbmtfdHlwZSA9IGNhc2Vfd2hlbigNCiAgICByYW5rX3R5cGUgPT0gImJ5X0dEUF9yYW5raW5ncyIgfiAiQWRqdXN0ZWQ6IEdEUCBwZXIgQ2FwaXRhIiwNCiAgICByYW5rX3R5cGUgPT0gImJ5X3BvcF9yYW5raW5ncyIgfiAiQWRqdXN0ZWQ6IFBvcHVsYXRpb24iLA0KICAgIHJhbmtfdHlwZSA9PSAicmF3X3JhbmtpbmdzIiB+ICJVbmFkanVzdGVkIFJhbmtpbmciLA0KICApKQ0KDQojcGxvdCB0aGUgcmVsYXRpdmUgcmFua2luZ3Mgb2YgdGhlIHRvcCAxMCByYXcgcmFua2luZyBjb3VudHJpZXMuDQpwMyA8LSBnZ3Bsb3QoZmlsdGVyKHRvcF8xMF9yYW5raW5ncyksIGFlcyh4ID0gcmFuaywgeSA9IHJlb3JkZXIoY291bnRyeSwgb3JkZXIpLCBjb2xvciA9IHJhbmtfdHlwZSkpDQpwMyArIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsNCiAgdGhlbWVfaGMoKSsgc2NhbGVfY29sb3VyX2hjKCkgKw0KICBsYWJzKCB4ID0gIlJhbmtpbmcgb3V0IG9mIDg0IENvdW50cmllcyIsIHkgPSAiIiwgY2FwdGlvbiA9ICJEYXRhIFNvdXJjZTogSW50ZXJuYXRpb25hbCBPbHltcGljIENvbW1pdHRlZSIsIA0KICAgICAgICB0aXRsZSA9ICJPbHltcGljIFJhbmtpbmdzIG9mIFRvcCAxMCBDb3VudHJpZXMgRGVjcmVhc2UgUG9zdC1BZGp1c3RtZW50cyIsIGNvbG9yID0gIlJhbmsgVHlwZSIpICsNCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHJldmVyc2U9VFJVRSkpDQoNCg0KYGBgDQoNCiMzLiBIb3N0IENvdW50cnkgQWR2YW50YWdlDQoNCg0KYGBge3IgZWNobz1UUlVFLCBldmFsPUZBTFNFfQ0KI29idGFpbiBhIGxpc3Qgb2YgaG9zdCBjaXRpZXMgYW5kIGNvdW50cmllcyBieSB5ZWFyDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShzdHJpbmdyKQ0Kd2lraV9ob3N0cyA8LSByZWFkX2h0bWwoImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N1bW1lcl9PbHltcGljX0dhbWVzIikNCmhvc3RzIDwtIGh0bWxfdGFibGUoaHRtbF9ub2Rlcyh3aWtpX2hvc3RzLCAidGFibGUiKVtbOF1dLCBmaWxsPVRSVUUpDQpob3N0cyA8LSBob3N0c1stMSwxOjNdDQpob3N0cyRjaXR5IDwtIHN0cl9zcGxpdF9maXhlZChob3N0cyRIb3N0LCBuPTIsICIsIilbLDFdDQpob3N0cyRjb3VudHJ5IDwtIHN0cl9zcGxpdF9maXhlZChob3N0cyRIb3N0LCBuPTIsICIsIilbLDJdDQpuYW1lcyhob3N0cykgPC0gYygib2x5bXBpYWQiLCAieWVhciIsICJob3N0IiwgImhvc3RfY2l0eSIsICJob3N0X2NvdW50cnkiKQ0KaG9zdHMgPC0gaG9zdHNbLCBjKDIsIDQsIDUpXQ0KDQojbWVyZ2UgaG9zdCBkYXRhIHdpdGggc3VtbWVyX29seW1waWNzIGRhdGENCmhvc3RzJGhvc3RfY291bnRyeSA8LSB0cmltd3MoaG9zdHMkaG9zdF9jb3VudHJ5KQ0KDQpob3N0cyA8LSBob3N0cyAlPiUNCiAgbXV0YXRlKGhvc3RfY291bnRyeSA9IGNhc2Vfd2hlbigNCiAgICBob3N0X2NvdW50cnkgPT0gIldlc3QgR2VybWFueSIgfiAiR2VybWFueSIsDQogICAgaG9zdF9jb3VudHJ5ID09ICJTb3ZpZXQgVW5pb24iIH4gIlJ1c3NpYSIsDQogICAgaG9zdF9jb3VudHJ5ID09ICJTb3V0aCBLb3JlYSIgfiAiS29yZWEsIFNvdXRoIiwNCiAgICBUUlVFIH4gaG9zdF9jb3VudHJ5DQogICkpDQoNCmhvc3RzJHllYXIgPC0gYXMubnVtZXJpYyhob3N0cyR5ZWFyKQ0KDQpob3N0X2FkdmFudGFnZSA8LSBzdW1tZXJfb2x5bXBpY3MgJT4lDQogIGxlZnRfam9pbihob3N0cywgYnkgPSAieWVhciIpIA0KDQojc3Vic2V0IGRhdGEgYnkgb25seSB0aGUgY291bnRyaWVzIHRoYXQgaGF2ZSBob3N0ZWQsIGFuZCBvbmx5IG9ic2VydmF0aW9ucyB3aGVyZSBhIG1lZGFsIGhhcyBiZWVuIGVhcm5lZA0KaG9zdF9hZHZhbnRhZ2UgPC0gc3Vic2V0KGhvc3RfYWR2YW50YWdlLCBjb3VudHJ5ICVpbiUgaG9zdHMkaG9zdF9jb3VudHJ5ICYgIWlzLm5hKG1lZGFsKSkNCg0KI21ha2UgYSBuZXcgZGF0YXNldCB3aXRoIHJlbGV2YW50IHZhcmlhYmxlcywgaW5jbHVkaW5nIHdoZXRoZXIgYSBjb3VudHJ5IHdhcyB0aGUgaG9zdCBmb3IgZWFjaCBvYnNlcnZhdGlvbi4NCmhvc3RfYWR2YW50YWdlIDwtIGhvc3RfYWR2YW50YWdlICU+JQ0KICBtdXRhdGUoIGlzX2hvc3QgPSBjYXNlX3doZW4oDQogICAgY291bnRyeT09aG9zdF9jb3VudHJ5IH4gIkhvc3QgQ291bnRyeSIsDQogICAgVFJVRSB+ICJWaXNpdGluZyBDb3VudHJ5Ig0KICApKQ0KaG9zdF9jb3VudHJpZXNfZGYgPC0gaG9zdF9hZHZhbnRhZ2VbLCBjKDE6MywgMjMpXQ0KDQojZ2V0IGNvdW50IG9mIG1lZGFscyBmb3IgZWFjaCBjb3VudHJ5IGVhY2ggeWVhcg0KaG9zdF9jb3VudHJpZXNfZGYgPC0gaG9zdF9jb3VudHJpZXNfZGYgJT4lDQogIGdyb3VwX2J5KGlzX2hvc3QsIHllYXIsIGNvdW50cnkpICU+JQ0KICBzdW1tYXJpc2UobWVkYWxfY291bnQgPSBuKCkpICU+JQ0KICBhcnJhbmdlKGRlc2MoeWVhcikpDQoNCiNnZXQgYXZlcmFnZSBtZWRhbHMgcGVyIGNvdW50cnkgZm9yIHZpc2l0aW5nIGNvdW50cmllcw0KdmlzaXRvcl9hdmVyYWdlcyA8LSBob3N0X2NvdW50cmllc19kZiAlPiUNCiAgc3Vic2V0KGlzX2hvc3QgPT0gIlZpc2l0aW5nIENvdW50cnkiKSAlPiUNCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lDQogIHN1bW1hcmlzZSh2aXNpdG9yX2F2ZXJhZ2UgPSBzdW0obWVkYWxfY291bnQpL24oKSkNCg0KI2dldCBhdmVyYWdlIG1lZGFscyBwZXIgY291bnRyeSBmb3IgaG9zdCBjb3VudHJpZXMNCmhvc3RfYXZlcmFnZXMgPC0gaG9zdF9jb3VudHJpZXNfZGYgJT4lDQogIHN1YnNldChpc19ob3N0ID09ICJIb3N0IENvdW50cnkiKSAlPiUNCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lDQogIHN1bW1hcmlzZShob3N0X2F2ZXJhZ2UgPSBzdW0obWVkYWxfY291bnQpL24oKSkNCg0KI21lcmdlIHRoZSBob3N0IGFuZCB2aXNpdG9yIGF2ZXJhZ2VzIGludG8gb25lIGRhdGFzZXQNCmNvdW50cnlfYXZlcmFnZSA8LSBsZWZ0X2pvaW4odmlzaXRvcl9hdmVyYWdlcywgaG9zdF9hdmVyYWdlcywgYnkgPSAiY291bnRyeSIpDQpjb3VudHJ5X2F2ZXJhZ2VzIDwtIGNvdW50cnlfYXZlcmFnZSAlPiUNCiAgZ2F0aGVyKCJ2aXNpdG9yX2F2ZXJhZ2UiLCAiaG9zdF9hdmVyYWdlIiwga2V5ID0gImlzX2hvc3QiLCB2YWx1ZSA9ICJtZWRhbF9jb3VudCIpICU+JQ0KICBtdXRhdGUoaXNfaG9zdCA9IGNhc2Vfd2hlbigNCiAgICBpc19ob3N0ID09InZpc2l0b3JfYXZlcmFnZSIgfiAiVmlzaXRvciIsDQogICAgVFJVRSB+ICJIb3N0Ig0KICApKQ0KDQpwNCA8LSBnZ3Bsb3QoY291bnRyeV9hdmVyYWdlcywgYWVzKHg9Y291bnRyeSwgeT1tZWRhbF9jb3VudCwgZmlsbD1pc19ob3N0KSkNCnBsb3Q0IDwtIHA0ICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIsIHdpZHRoID0gMC44KSArDQogIGdlb21fYmFyKHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IiwgZGF0YT1maWx0ZXIoY291bnRyeV9hdmVyYWdlcywgY291bnRyeT09IkJlbGdpdW0iKSwgDQogICAgICAgICAgIGNvbG9yPSJob3QgcGluayIsIHNpemUgPSAwLjgpICsNCiAgY29vcmRfZmxpcCgpICsgdGhlbWVfdHVmdGUoKSArIHNjYWxlX2ZpbGxfaGMoKSArDQogIGxhYnModGl0bGUgPSAiQmVsZ2l1bSBXaW5zIDE3IFRpbWVzIE1vcmUgTWVkYWxzIGFzIEhvc3QgdGhhbiBhcyBWaXNpdG9yIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIFNvdXJjZTogSW50ZXJuYXRpb25hbCBPbHltcGljIENvbW1pdHRlZSIsDQogICAgICAgeSA9ICJBdmVyYWdlIE1lZGFscyBXb24gUGVyIEdhbWUiLCB4ID0gIiIsIGZpbGw9IiIsIGNvbG9yPSIiKQ0KcGxvdDQNCg0KYGBgDQoNCkknbSBub3Qgc3VyZSB3aHkgdGhlIHBsb3QgZm9yIG51bWJlciAzIGlzbid0IHNob3dpbmcgdXAgaW4gdGhlIGtuaXR0ZWQgZmlsZSBldmVuIHRob3VnaCBpdCBpcyBwcm9kdWNlZCBpbiB0aGUgcm1kIGZpbGUuIEkgcG9zdGVkIHRoaXMgcXVlc3Rpb24gb24gUGlhenphIGFuZCB0cmllZCB0cm91Ymxlc2hvb3RpbmcgaXQgYm90aCBteXNlbGYgYW5kIHdpdGggdGhlIGhlbHAgb2YgdGhlIFRBLCBidXQgaXQgZGlkIG5vdCB3b3JrLiBQbGVhc2UgbG9vayBpbiB0aGUgcm1kIGZpbGUgdG8gc2VlIHRoZSBwbG90Lg0KDQojNC4gTW9zdCBTdWNjZXNzZnVsIEF0aGxldGVzDQojIzRhKQ0KRmlyc3QgbWFrZSBhIGRhdGFzZXQgdGhhdCBpbmNsdWRlcyB0aGUgdG9wIDEwIG1vc3Qgc3VjY2Vzc2Z1bCBhdGhsZXRlcyBhbmQgdGhlIG1lZGFscyB0aGV5IGhhdmUgd29uLiBUaGVuIHBsb3QgdGhlbSBvbiBhIGJhciBwbG90IHRoYXQgc2hvd3MgdGhlIG51bWJlciBvZiBtZWRhbHMgdGhleSBoYXZlIGFuZCB3aGVyZSB0aGV5IGFyZSBmcm9tLg0KYGBge3J9DQojZ2V0IGEgZGF0YXNldCBvZiBpbmRpdmlkdWFscyB3aXRoIHRoZSBudW1iZXIgb2YgbWVkYWxzIHRoZXkgaGF2ZSB0byBkZXRlcm1pbmUgd2hvIHRoZSBtb3N0IHN1Y2Nlc3NmdWwgYXRobGV0ZXMgYXJlLg0KaW5kaXZfbWVkYWxzIDwtIHN1bW1lcl9vbHltcGljcyAlPiUNCiAgbXV0YXRlKGF0aGxldGUgPSBwYXN0ZShuYW1lLCAiOiIsIGNvdW50cnkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShtZWRhbCkpDQppbmRpdl9tZWRhbHMyIDwtIGluZGl2X21lZGFscyAlPiUNCiAgZ3JvdXBfYnkoYXRobGV0ZSkgJT4lDQogIHN1bW1hcmlzZShtZWRhbF9jb3VudCA9IG4oKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtZWRhbF9jb3VudCkpDQoNCmJlc3RfYXRobGV0ZXMgPC0gaGVhZChpbmRpdl9tZWRhbHMyLCAxNCkNCmJlc3RfYXRobGV0ZXMkcmFuayA8LSBjKDE6MTQpDQoNCiMgc3Vic2V0IHRoZSBpbmRpdmlkdWFsIG1lZGFscyBkYXRhc2V0IHRvIGluY2x1ZGUgb25seSB0aGUgdG9wIDEwIGF0aGxldGVzLg0KYmVzdF9hdGhsZXRlc19kZiA8LSBzdWJzZXQoaW5kaXZfbWVkYWxzLCBpbmRpdl9tZWRhbHMkYXRobGV0ZSAlaW4lIGJlc3RfYXRobGV0ZXMkYXRobGV0ZSkNCmJlc3RfYXRobGV0ZXNfZGYgPC0gYmVzdF9hdGhsZXRlc19kZiAlPiUNCiAgbXV0YXRlKG5hbWUgPSBjYXNlX3doZW4oDQogICAgbmFtZT09IkxhcnlzYSBTZW1lbml2bmEgTGF0eW5pbmEgKERpcml5LSkiIH4gIkxhcnlzYSBTZW1lbml2bmEgTGF0eW5pbmEiLA0KICAgIG5hbWU9PSJEYXJhIEdyYWNlIFRvcnJlcyAoLUhvZmZtYW4sIC1NaW5hcykiIH4gIkRhcmEgR3JhY2UgVG9ycmVzIiwNCiAgICBuYW1lPT0iSmVubmlmZXIgRWxpc2FiZXRoIFwiSmVubnlcIiBUaG9tcHNvbiAoLUN1bXBlbGlrKSIgfiJKZW5uaWZlciBFbGlzYWJldGggVGhvbXBzb24iLA0KICAgIG5hbWU9PSJOYXRhbGllIEFubmUgQ291Z2hsaW4gKC1IYWxsKSIgfiJOYXRhbGllIEFubmUgQ291Z2hsaW4iLA0KICAgIFRSVUUgfiBuYW1lDQogICkpDQoNCmJlc3RfYXRobGV0ZXNfZGYgPC0gYmVzdF9hdGhsZXRlc19kZiAlPiUNCiAgbGVmdF9qb2luKGJlc3RfYXRobGV0ZXMsIGJ5ID0gImF0aGxldGUiKSAlPiUNCiAgYXJyYW5nZShyYW5rKQ0KDQogIA0KI3Bsb3QgdGhlIDEwIG1vc3Qgc3VjY2Vzc2Z1bCBhdGhsZXRlcyB1c2luZyBhIGJhcnBsb3QgdGhhdCBzaG93cyBob3cgbWFueSBtZWRhbHMgdGhleSBoYXZlIHdvbi4NCnA1IDwtIGdncGxvdChiZXN0X2F0aGxldGVzX2RmLCBhZXMoeCA9IHJlb3JkZXIobmFtZSwgcmV2KHJhbmspKSkpDQpwbG90NSA8LSBwNSArIGdlb21fYmFyKGZpbGw9ImxpZ2h0IGJsdWUiLCB3aWR0aD0wLjYpICsNCiAgdGhlbWVfdHVmdGUoKSArDQogIGNvb3JkX2ZsaXAoKSArIGxhYnMoeD0iIiwgeSA9ICJUb3RhbCBOdW1iZXIgb2YgTWVkYWxzIEF3YXJkZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJNb3N0IFN1Y2Nlc3NmdWwgQXRobGV0ZXMgU2luY2UgMTg5NiIsDQogICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbj0iRGF0YSBTb3VyY2U6IEludGVybmF0aW9uYWwgT2x5bXBpYyBDb21taXR0ZWUiKQ0KcGxvdDUNCg0KYGBgDQoNCg0KDQoNCg0KIyMgNGIpDQoNClRoZSBncmFwaCBiZWxvdyBzaG93cyB0aGF0IGFtb25nIHRoZSB0b3AgYXRobGV0ZXMsIHRob3NlIGZyb20gdGhlIHNhbWUgY291bnRyeSB0ZW5kIHRvIHdpbiBtZWRhbHMgaW4gdGhlIHNhbWUgc3BvcnRzLg0KDQpgYGB7cn0NCmJlc3RfYXRobGV0ZXNfZGYkYXRobGV0ZSA8LSBwYXN0ZShiZXN0X2F0aGxldGVzX2RmJG5hbWUsICJbIiwgYmVzdF9hdGhsZXRlc19kZiRjb3VudHJ5LCAiXSIpDQoNCnA1IDwtIGdncGxvdChiZXN0X2F0aGxldGVzX2RmLCBhZXMoeCA9IHJlb3JkZXIobmFtZSwgcmV2KHJhbmspKSwgIGZpbGw9c3BvcnQpKQ0KcGxvdDUgPC0gcDUgKyBnZW9tX2Jhcih3aWR0aD0wLjgpICsNCiAgY29vcmRfZmxpcCgpICsgbGFicyh4PSIiLCB5ID0gIlRvdGFsIE51bWJlciBvZiBNZWRhbHMgQXdhcmRlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIk1vc3QgU3VjY2Vzc2Z1bCBBdGhsZXRlcyBTaW5jZSAxODk2IiwNCiAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uPSJEYXRhIFNvdXJjZTogSW50ZXJuYXRpb25hbCBPbHltcGljIENvbW1pdHRlZSIsDQogICAgICAgICAgICAgICAgICAgICAgZmlsbD0iIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiY2FkZXRibHVlMiIsICJraGFraTEiLCAiZ3JlZW40IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRpYW5yZWQyIiwgImhvdHBpbms0IiwgImRhcmtibHVlIikpICsNCiAgZmFjZXRfZ3JpZChjb3VudHJ5fiAuICwgc2NhbGVzPSJmcmVlX3kiLCBzcGFjZT0iZnJlZSIpICsgDQogIHRoZW1lX3BhbmRlcigpICsgdGhlbWUoc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCkpIA0KcGxvdDUNCg0KYGBgDQoNCiM1LiBNYWtlIFR3byBQbG90cyBJbnRlcmFjdGl2ZQ0KSSBhZGRlZCBpbnRlcmFjdGl2aXR5IHRvIHRoZSB0d28gcGxvdHMgaW4gcXVlc3Rpb24gbnVtYmVyIDEuDQoNCkludGVyYWN0aXZpdHkgaXMgaGVscGZ1bCBpbiB0aGUgYmFyIGdyYXBoIGJlY2F1c2UgaXQgYWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBieSBzZXguIERvaW5nIHNvIGNsZWFycyB1cCB0aGUgY2x1dHRlciBmcm9tIGhhdmluZyB0d28gc2V0cyBvZiBiYXJzIGZvciBlYWNoIGNvdW50cnkuIEFkZGl0aW9uYWxseSwgdXNlcnMgY2FuIGFsc28gaG92ZXIgb3ZlciBhbnkgYmFyIGFuZCBzZWUgdGhlIG1lZGFsIGNvdW50IGZvciB0aGF0IGJhci4NCg0KSW50ZXJhY3Rpdml0eSBpcyBoZWxwZnVsIGluIHRoZSBsaW5lIGdyYXBoIGJlY2F1c2Ugd2hpbGUgdGhlIHN0YXRpYyBwbG90IHdvdWxkIGdpdmUgdGhlIHJlYWRlciBhIHNlbnNlIG9mIHRoZSBvdmVyYWxsIHRyZW5kIGFjcm9zcyBhbGwgY291bnRyaWVzLCBtYWtpbmcgaXQgaW50ZXJhY3RpdmUgd2lsbCBhbGxvdyB0aGUgcmVhZGVyIHRvIHNlbGVjdCB3aGljaCBjb3VudHJpZXMgaGUgd2FudHMgdG8gbG9vayBhdC4gRXNwZWNpYWxseSB3aXRoIG11bHRpcGxlIHNwYWdoZXR0aSBsaW5lcyBpbiBkaWZmZXJlbnQgY29sb3JzLCBpdCBpcyBkaWZmaWN1bHQgdG8gc2VlIGVhY2ggbGluZSB3aXRob3V0IG1ha2luZyBpdCBpbnRlcmFjdGl2ZS4gVGhlIGludGVyYWN0aXZpdHkgYWxzbyBhbGxvd3MgcmVhZGVycyB0byBob3ZlciBvdmVyIGFueSBkYXRhIHBvaW50IGFuZCBzZWUgdGhlIGV4YWN0IG51bWJlciBvZiBtZWRhbHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZGF0YSBwb2ludC4NCg0KIzYuIERhdGEgVGFibGUNCg0KSSB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdW5hZGp1c3RlZCByYW5raW5ncyBiYXNlZCBvbiBtZWRhbCBjb3VudHMsIGFzIHdlbGwgYXMgYWRqdXN0ZWQgcmFua2luZ3MgYmFzZWQgb24gR0RQIGFuZCBvbiBwb3B1bGF0aW9uLiBJIHRoaW5rIGl0IGlzIGluZm9ybWF0aXZlIGJlY2F1c2UgdXN1YWxseSB3ZSBvbmx5IHNlZSB0aGUgdG90YWwgbnVtYmVyIG9mIG1lZGFscyBhIGNvdW50cnkgd2lucy4gQnV0IGNvdW50cmllcyB3aXRoIGxvdyB1bmFkanVzdGVkIHJhbmtpbmdzIGFuZCBoaWdoZXIgYWRqdXN0ZWQgcmFua2luZ3MgYWxzbyBkZXNlcnZlIGEgc3BvdGxpZ2h0LiBJIGhhdmUgYWxsb3dlZCBzb3J0aW5nIHNvIHRoYXQgdXNlcnMgY2FuIHNlZSBob3cgY291bnRyaWVzIHRoYXQgcmFuayBoaWdoIGluIG9uZSBtZWFzdXJlIGhvbGRzIHVwIGluIGFub3RoZXIgbWVhc3VyZS4gRmlsdGVycyBhcmUgYWxzbyBhdmFpbGFibGUgZm9yIHVzZXJzIHdobyB3YW50IHRvIGZpbHRlciBieSBjb3VudHJ5IG9yIGJ5IGEgcmFua2luZy4gVGhlIGRhdGEgZm9yIG1lZGFsIGNvdW50cywgcG9wdWxhdGlvbiwgYW5kIEdEUCBwZXIgY2FwaXRhIGFyZSBhbHNvIGtlcHQgaW4gdGhlIGRhdGFzZXQgaW4gY2FzZSB1c2VycyB3YW50IHRvIGxvb2sgZGVlcGVyIGludG8gdGhlIGRhdGEuDQpgYGB7cn0NCiNtYWtlIGEgZGF0YXNldCB3aXRoIGFkanVzdG1lbnRzIGJhc2VkIG9uIHRoZSAyMDE2IG1lZGFsIHJhbmtpbmdzIGRhdGFzZXQuDQoNCiNzaG93IE5BJ3MgYXMgLS0gZm9yIGJ5X3BvcF9yYW5raW5ncyBhbmQgYnlfR0RQX3JhbmtpbmdzDQpmb3IgKGkgaW4gc2VxX2Fsb25nKG1lZGFsX3JhbmtpbmdzXzIwMTYkcG9wKSl7DQogIGlmIChpcy5uYShtZWRhbF9yYW5raW5nc18yMDE2JHBvcFtpXSkpIHsNCiAgICBtZWRhbF9yYW5raW5nc18yMDE2JGJ5X3BvcF9yYW5raW5nc1tpXSA8LSAiLS0iDQogIH0NCn0NCmZvciAoaSBpbiBzZXFfYWxvbmcobWVkYWxfcmFua2luZ3NfMjAxNiRHRFBfcGVyX2NhcGl0YSkpew0KICBpZiAoaXMubmEobWVkYWxfcmFua2luZ3NfMjAxNiRHRFBfcGVyX2NhcGl0YVtpXSkpIHsNCiAgICBtZWRhbF9yYW5raW5nc18yMDE2JGJ5X0dEUF9yYW5raW5nc1tpXSA8LSAiLS0iDQogIH0NCn0NCg0KI2Ryb3AgaXJyZWxldmFudCBjb2x1bW5zIGFuZCByb3VuZCBHRFBfcGVyX2NhcGl0YQ0KbWVkYWxfcmFua2luZ3NfZHQgPC0gbWVkYWxfcmFua2luZ3NfMjAxNlssIGMoMSwgNSw3LDksMiwzLDQpXQ0KbWVkYWxfcmFua2luZ3NfZHQkR0RQX3Blcl9jYXBpdGEgPC0gbGFwcGx5KG1lZGFsX3JhbmtpbmdzX2R0JEdEUF9wZXJfY2FwaXRhLCByb3VuZCwgMikNCg0KI3Nob3cgR0RQX3Blcl9jYXBpdGEgYW5kIHBvcCBuYSB2YWx1ZXMgYXMgLS0uDQpmb3IgKGkgaW4gc2VxX2Fsb25nKG1lZGFsX3JhbmtpbmdzX2R0JEdEUF9wZXJfY2FwaXRhKSl7DQogIGlmIChpcy5uYShtZWRhbF9yYW5raW5nc19kdCRHRFBfcGVyX2NhcGl0YVtpXSkpIHsNCiAgICBtZWRhbF9yYW5raW5nc19kdCRHRFBfcGVyX2NhcGl0YVtpXSA8LSAiLS0iDQogIH0NCn0NCg0KZm9yIChpIGluIHNlcV9hbG9uZyhtZWRhbF9yYW5raW5nc19kdCRwb3ApKXsNCiAgaWYgKGlzLm5hKG1lZGFsX3JhbmtpbmdzX2R0JHBvcFtpXSkpIHsNCiAgICAgbWVkYWxfcmFua2luZ3NfZHQkcG9wW2ldIDwtICItLSINCiAgfQ0KfQ0KDQojVGFrZSBvdXQgVGFpd2FuIHNpbmNlbmVpdGhlciBwb3B1bGF0aW9uIG5vciAgR0RQIHBlciBDYXBpdGEgZGF0YSBpcyBhdmFpbGFibGUgdG8gY29tcGFyZS4NCm1lZGFsX3JhbmtpbmdzX2R0IDwtIG1lZGFsX3JhbmtpbmdzX2R0ICU+JQ0KICBzdWJzZXQoY291bnRyeSE9IlRhaXdhbiIpDQoNCiNNYWtlIHRoZSBoZWFkZXJzIGZvciBlYWNoIGNvbHVtbg0KZHRfaGVhZGVycyA8LSBjKCJDb3VudHJ5IiwgICJVbmFkanVzdGVkIFJhbmtpbmciLCAiUmFua2luZyBBZGp1c3RlZCBieSBQb3B1bGF0aW9uIiwgIlJhbmtpbmcgQWRqdXN0ZWQgYnkgR0RQIHBlciBDYXBpdGEiLA0KICAgICAgICAgICAgICAgICJUb3RhbCBNZWRhbCBDb3VudCIsICJQb3B1bGF0aW9uIiwgIkdEUCBwZXIgQ2FwaXRhICgkKSIpDQoNCmBgYA0KDQpgYGB7cn0NCiNNYWtlIHRoZSBkYXRhdGFibGUNCmxpYnJhcnkoRFQpDQpkYXRhdGFibGUobWVkYWxfcmFua2luZ3NfZHQsIHJvd25hbWVzPUZBTFNFLCBjb2xuYW1lcz1kdF9oZWFkZXJzLA0KICAgICAgICAgIGZpbHRlcj1saXN0KHBvc2l0aW9uPSJ0b3AiKSwgb3B0aW9ucyA9IGxpc3QoY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtcmlnaHQnLCB0YXJnZXRzID0gMDo2KSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICApDQoNCmBgYA0KDQoNCg0KYGBge3J9DQoNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KDQpgYGANCg0KDQoNCg0K